Load packages in

pacman::p_load(sf, readr, tidyverse, tmap)

Load Data in

Geospatial Data

seoul <- st_read(dsn = "data_final/seoul_adm2",
                 layer= "seoul_adm2") %>%
  st_transform(crs = 5179)
Reading layer `seoul_adm2' from data source 
  `/Users/junhaoteo/Documents/junhao2309/Geospatial-Analytics-Project-KR/data_final/seoul_adm2' using driver `ESRI Shapefile'
Simple feature collection with 748 features and 6 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: 126.7644 ymin: 37.42854 xmax: 127.1838 ymax: 37.70139
Geodetic CRS:  WGS 84
clinics <- st_read(dsn = "data_final/seoul_clinics",
                   layer = "seoul_clinics") %>%
  st_transform(crs = 5179)
Reading layer `seoul_clinics' from data source 
  `/Users/junhaoteo/Documents/junhao2309/Geospatial-Analytics-Project-KR/data_final/seoul_clinics' using driver `ESRI Shapefile'
Simple feature collection with 40 features and 4 fields
Geometry type: MULTIPOINT
Dimension:     XY
Bounding box:  xmin: 126.8894 ymin: 37.48397 xmax: 127.0858 ymax: 37.63072
Geodetic CRS:  WGS 84
hospitals <- st_read(dsn = "data_final/seoul_hospitals",
                     layer = "seoul_hospitals") %>%
  st_transform(crs = 5179)
Reading layer `seoul_hospitals' from data source 
  `/Users/junhaoteo/Documents/junhao2309/Geospatial-Analytics-Project-KR/data_final/seoul_hospitals' using driver `ESRI Shapefile'
Simple feature collection with 88 features and 4 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: 126.8351 ymin: 37.45503 xmax: 127.1581 ymax: 37.64912
Geodetic CRS:  WGS 84
residence <- st_read(dsn = "data_final/seoul_residential",
                     layer = "seoul_residential") %>%
  st_transform(crs = 5179)
Reading layer `seoul_residential' from data source 
  `/Users/junhaoteo/Documents/junhao2309/Geospatial-Analytics-Project-KR/data_final/seoul_residential' using driver `ESRI Shapefile'
Simple feature collection with 9640 features and 5 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: 126.8081 ymin: 37.43452 xmax: 127.1722 ymax: 37.67945
Geodetic CRS:  WGS 84
road <- st_read(dsn="data_final/seoul_roads",
                layer = "seoul_roads_v2")%>%
  st_transform(crs = 5179)
Reading layer `seoul_roads_v2' from data source 
  `/Users/junhaoteo/Documents/junhao2309/Geospatial-Analytics-Project-KR/data_final/seoul_roads' using driver `ESRI Shapefile'
Simple feature collection with 100303 features and 10 fields
Geometry type: MULTILINESTRING
Dimension:     XY
Bounding box:  xmin: 126.7662 ymin: 37.42867 xmax: 127.1831 ymax: 37.70137
Geodetic CRS:  WGS 84

Select wanted datasets

clinic <- clinics %>%
  select(1,3)
hospitals <- hospitals %>%
  select(1,3)
residence <- residence %>%
  select(1,3)
road <- road %>%
  select(1,3)

Aspatial Data

population <- read_csv("data_final/population_seoul.csv")
Rows: 25 Columns: 21── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr  (1): By administrative divisions(eup, myeon, dong)
dbl (20): Total population (Person), Male (Person), Female (Person), Korean - total (Person), Korean - male (Person), Korean -...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

Data Wrangling

Geospatial

pop <- population %>%
  select(1,2) %>%
  mutate(Elderly_pop = round(0.1758*`Total population (Person)`,0)) %>%
  rename(name_en =`By administrative divisions(eup, myeon, dong)`)
Gu <- pop$name_en

seoul <- seoul %>%
  filter(name_en %in% Gu) %>%
  select(name_en)
seoul_pop <- seoul %>%
  left_join(pop,
             by = "name_en") 
st_write(seoul_pop,
         dsn = "data_final",
         layer = "seoul_pop",
         driver = "ESRI Shapefile")
seoul_pop <- st_read(dsn = "data_final/",
                     layer = "seoul_pop")
tm_shape(seoul_pop)+
  tm_fill("Elderly_pop", 
          style = "quantile", 
          palette = "Greens",
          title = "Elderly Population") +
  tm_layout(main.title = "Elderly Population",
            main.title.position = "center",
            main.title.size = 1.2,
            legend.height = 0.45, 
            legend.width = 0.35,
            frame = TRUE) +
  tm_borders(alpha = 0.5) +
  tm_compass(type="8star", size = 2) +
  tm_scale_bar() +
  tm_grid(alpha =0.2) +
  tm_credits("Source: Data.korea", 
             position = c("left", "bottom")) +
  tmap_style("classic")
tmap style set to "classic"
other available styles are: "white", "gray", "natural", "cobalt", "col_blind", "albatross", "beaver", "bw", "watercolor" 
Credits not supported in view mode.
Compass not supported in view mode.

Start of Network Constrained Spatial Point

Packages needed

pacman::p_load(sf, spNetwork)
tmap_mode("view")
tmap mode set to interactive viewing
tm_shape(roads_by_gwanak) +
  tm_lines()
roads_by_gwanak <- roads_by_gu_new %>%
  filter(name_en == "Gwanak-gu")
hospital_by_gwanak <- hospital_by_gu %>%
  filter(name_en == "Gwanak-gu")
residence_by_gwanak <- residence_by_gu %>%
  filter(name_en == "Gwanak-gu")

Ensure datasets are in the right format for NKDE

hospital_by_gu <- st_centroid(hospital_by_gu)
Warning: st_centroid assumes attributes are constant over geometries of x
residence_by_gu <- st_centroid(residence_by_gu)
Warning: st_centroid assumes attributes are constant over geometries of x
if ("MULTILINESTRING" %in% st_geometry_type(roads_by_gu)){
  converted <- st_cast(roads_by_gu[which(st_geometry_type(roads_by_gu) == "MULTILINESTRING"),], "LINESTRING")
  linestring <- roads_by_gu[which(st_geometry_type(roads_by_gu) == "LINESTRING"),]
  roads_by_gu_new<- rbind(linestring, converted)
}
Warning: repeating attributes for all sub-geometries for which they may not be constant
roads_by_gwanak <- roads_by_gu_new %>%
  filter(name_en == "Gwanak-gu")
hospital_by_gwanak <- hospital_by_gu %>%
  filter(name_en == "Gwanak-gu")
residence_by_gwanak <- residence_by_gu %>%
  filter(name_en == "Gwanak-gu")
tmap_mode("view")
tm_shape(roads_by_gwanak) +
  tm_lines() +
  tm_shape(hospital_by_gwanak) +
  tm_dots(col = "green") +
  tm_shape(residence_by_gwanak) +
  tm_dots(col = "red")

Preparing lixels object

# Filter out only LINESTRING geometries
lixels <- lixelize_lines(roads_by_gwanak, 700, mindist = 350)

Generating line centre points

samples <- lines_center(lixels)

Performing NetKDE

hospital_by_gwanak_sp <- as_Spatial(hospital_by_gwanak)
densities <- nkde(roads_by_gwanak, 
                  events = hospital_by_gwanak,
                  w = rep(1,nrow(hospital_by_gwanak)),
                  samples = samples,
                  kernel_name = "quartic",
                  bw = 300, 
                  div= "bw", 
                  adaptive = FALSE,
                  method = "continuous", 
                  digits = 1, 
                  tol = 1,
                  grid_shape = c(1,1), 
                  max_depth = 8,
                  agg = 20, #we aggregate events within a 5m radius (faster calculation)
                  sparse = TRUE,
                  verbose = FALSE)

Visualising NETKDE

samples$density <- densities*1000
lixels$density <- densities*1000
tmap_mode('view')
tmap mode set to interactive viewing
tm_shape(lixels)+
  tm_lines(col="density")

Network constrained G and K function

Ho: The observed spatial point events (i.e distribution of childcare centres) are uniformly distributed over a street network in Punggol Planning Area.

kfun_hospital <- kfunctions(roads_by_gwanak, 
                             hospital_by_gwanak,
                             start = 0, 
                             end = 30, 
                             step = 1, 
                             width = 50, 
                             nsim = 50, 
                             resolution = 50,
                             verbose = FALSE, 
                             conf_int = 0.05)
kfun_hospital$plotk

Geographical accessibility

Using Euclidean Distance

library(sf)
library(rgeos)

distance_matrix <- as.matrix(st_distance(residence_by_gwanak, hospital_by_gwanak))
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKIyBMb2FkIHBhY2thZ2VzIGluCgpgYGB7cn0KcGFjbWFuOjpwX2xvYWQoc2YsIHJlYWRyLCB0aWR5dmVyc2UsIHRtYXApCmBgYAoKIyBMb2FkIERhdGEgaW4KCiMjIEdlb3NwYXRpYWwgRGF0YQoKYGBge3J9CnNlb3VsIDwtIHN0X3JlYWQoZHNuID0gImRhdGFfZmluYWwvc2VvdWxfYWRtMiIsCiAgICAgICAgICAgICAgICAgbGF5ZXI9ICJzZW91bF9hZG0yIikgJT4lCiAgc3RfdHJhbnNmb3JtKGNycyA9IDUxNzkpCmBgYAoKYGBge3J9CmNsaW5pY3MgPC0gc3RfcmVhZChkc24gPSAiZGF0YV9maW5hbC9zZW91bF9jbGluaWNzIiwKICAgICAgICAgICAgICAgICAgIGxheWVyID0gInNlb3VsX2NsaW5pY3MiKSAlPiUKICBzdF90cmFuc2Zvcm0oY3JzID0gNTE3OSkKaG9zcGl0YWxzIDwtIHN0X3JlYWQoZHNuID0gImRhdGFfZmluYWwvc2VvdWxfaG9zcGl0YWxzIiwKICAgICAgICAgICAgICAgICAgICAgbGF5ZXIgPSAic2VvdWxfaG9zcGl0YWxzIikgJT4lCiAgc3RfdHJhbnNmb3JtKGNycyA9IDUxNzkpCnJlc2lkZW5jZSA8LSBzdF9yZWFkKGRzbiA9ICJkYXRhX2ZpbmFsL3Nlb3VsX3Jlc2lkZW50aWFsIiwKICAgICAgICAgICAgICAgICAgICAgbGF5ZXIgPSAic2VvdWxfcmVzaWRlbnRpYWwiKSAlPiUKICBzdF90cmFuc2Zvcm0oY3JzID0gNTE3OSkKcm9hZCA8LSBzdF9yZWFkKGRzbj0iZGF0YV9maW5hbC9zZW91bF9yb2FkcyIsCiAgICAgICAgICAgICAgICBsYXllciA9ICJzZW91bF9yb2Fkc192MiIpJT4lCiAgc3RfdHJhbnNmb3JtKGNycyA9IDUxNzkpCmBgYAoKIyMgU2VsZWN0IHdhbnRlZCBkYXRhc2V0cwoKYGBge3J9CmNsaW5pYyA8LSBjbGluaWNzICU+JQogIHNlbGVjdCgxLDMpCmhvc3BpdGFscyA8LSBob3NwaXRhbHMgJT4lCiAgc2VsZWN0KDEsMykKcmVzaWRlbmNlIDwtIHJlc2lkZW5jZSAlPiUKICBzZWxlY3QoMSwzKQpyb2FkIDwtIHJvYWQgJT4lCiAgc2VsZWN0KDEsMykKYGBgCgojIyBBc3BhdGlhbCBEYXRhCgpgYGB7cn0KcG9wdWxhdGlvbiA8LSByZWFkX2NzdigiZGF0YV9maW5hbC9wb3B1bGF0aW9uX3Nlb3VsLmNzdiIpCmBgYAoKIyBEYXRhIFdyYW5nbGluZwoKIyMgR2Vvc3BhdGlhbAoKYGBge3J9CnBvcCA8LSBwb3B1bGF0aW9uICU+JQogIHNlbGVjdCgxLDIpICU+JQogIG11dGF0ZShFbGRlcmx5X3BvcCA9IHJvdW5kKDAuMTc1OCpgVG90YWwgcG9wdWxhdGlvbiAoUGVyc29uKWAsMCkpICU+JQogIHJlbmFtZShuYW1lX2VuID1gQnkgYWRtaW5pc3RyYXRpdmUgZGl2aXNpb25zKGV1cCwgbXllb24sIGRvbmcpYCkKYGBgCgpgYGB7cn0KR3UgPC0gcG9wJG5hbWVfZW4KCnNlb3VsIDwtIHNlb3VsICU+JQogIGZpbHRlcihuYW1lX2VuICVpbiUgR3UpICU+JQogIHNlbGVjdChuYW1lX2VuKQpgYGAKCmBgYHtyfQpzZW91bF9wb3AgPC0gc2VvdWwgJT4lCiAgbGVmdF9qb2luKHBvcCwKICAgICAgICAgICAgIGJ5ID0gIm5hbWVfZW4iKSAKYGBgCgpgYGB7ciwgZXZhbCA9IEZBTFNFfQpzdF93cml0ZShzZW91bF9wb3AsCiAgICAgICAgIGRzbiA9ICJkYXRhX2ZpbmFsIiwKICAgICAgICAgbGF5ZXIgPSAic2VvdWxfcG9wIiwKICAgICAgICAgZHJpdmVyID0gIkVTUkkgU2hhcGVmaWxlIikKYGBgCgpgYGB7ciwgZXZhbCA9IEZBTFNFfQpzZW91bF9wb3AgPC0gc3RfcmVhZChkc24gPSAiZGF0YV9maW5hbC8iLAogICAgICAgICAgICAgICAgICAgICBsYXllciA9ICJzZW91bF9wb3AiKQpgYGAKCmBgYHtyfQp0bV9zaGFwZShzZW91bF9wb3ApKwogIHRtX2ZpbGwoIkVsZGVybHlfcG9wIiwgCiAgICAgICAgICBzdHlsZSA9ICJxdWFudGlsZSIsIAogICAgICAgICAgcGFsZXR0ZSA9ICJHcmVlbnMiLAogICAgICAgICAgdGl0bGUgPSAiRWxkZXJseSBQb3B1bGF0aW9uIikgKwogIHRtX2xheW91dChtYWluLnRpdGxlID0gIkVsZGVybHkgUG9wdWxhdGlvbiIsCiAgICAgICAgICAgIG1haW4udGl0bGUucG9zaXRpb24gPSAiY2VudGVyIiwKICAgICAgICAgICAgbWFpbi50aXRsZS5zaXplID0gMS4yLAogICAgICAgICAgICBsZWdlbmQuaGVpZ2h0ID0gMC40NSwgCiAgICAgICAgICAgIGxlZ2VuZC53aWR0aCA9IDAuMzUsCiAgICAgICAgICAgIGZyYW1lID0gVFJVRSkgKwogIHRtX2JvcmRlcnMoYWxwaGEgPSAwLjUpICsKICB0bV9jb21wYXNzKHR5cGU9IjhzdGFyIiwgc2l6ZSA9IDIpICsKICB0bV9zY2FsZV9iYXIoKSArCiAgdG1fZ3JpZChhbHBoYSA9MC4yKSArCiAgdG1fY3JlZGl0cygiU291cmNlOiBEYXRhLmtvcmVhIiwgCiAgICAgICAgICAgICBwb3NpdGlvbiA9IGMoImxlZnQiLCAiYm90dG9tIikpICsKICB0bWFwX3N0eWxlKCJjbGFzc2ljIikKYGBgCgojIFN0YXJ0IG9mIE5ldHdvcmsgQ29uc3RyYWluZWQgU3BhdGlhbCBQb2ludAoKIyMgUGFja2FnZXMgbmVlZGVkCgpgYGB7cn0KcGFjbWFuOjpwX2xvYWQoc2YsIHNwTmV0d29yaykKYGBgCgpgYGB7cn0KdG1hcF9tb2RlKCJ2aWV3IikKdG1fc2hhcGUocm9hZHNfYnlfZ3dhbmFrKSArCiAgdG1fbGluZXMoKQpgYGAKCmBgYHtyfQpyb2Fkc19ieV9ndSA8LSBzdF9pbnRlcnNlY3Rpb24ocm9hZCwgc2VvdWwpCmhvc3BpdGFsX2J5X2d1IDwtIHN0X2ludGVyc2VjdGlvbihob3NwaXRhbHMsIHNlb3VsKQpyZXNpZGVuY2VfYnlfZ3UgPC0gc3RfaW50ZXJzZWN0aW9uKHJlc2lkZW5jZSwgc2VvdWwpCmBgYAoKRW5zdXJlIGRhdGFzZXRzIGFyZSBpbiB0aGUgcmlnaHQgZm9ybWF0IGZvciBOS0RFCgpgYGB7cn0KaG9zcGl0YWxfYnlfZ3UgPC0gc3RfY2VudHJvaWQoaG9zcGl0YWxfYnlfZ3UpCnJlc2lkZW5jZV9ieV9ndSA8LSBzdF9jZW50cm9pZChyZXNpZGVuY2VfYnlfZ3UpCmBgYAoKYGBge3J9CmlmICgiTVVMVElMSU5FU1RSSU5HIiAlaW4lIHN0X2dlb21ldHJ5X3R5cGUocm9hZHNfYnlfZ3UpKXsKICBjb252ZXJ0ZWQgPC0gc3RfY2FzdChyb2Fkc19ieV9ndVt3aGljaChzdF9nZW9tZXRyeV90eXBlKHJvYWRzX2J5X2d1KSA9PSAiTVVMVElMSU5FU1RSSU5HIiksXSwgIkxJTkVTVFJJTkciKQogIGxpbmVzdHJpbmcgPC0gcm9hZHNfYnlfZ3Vbd2hpY2goc3RfZ2VvbWV0cnlfdHlwZShyb2Fkc19ieV9ndSkgPT0gIkxJTkVTVFJJTkciKSxdCiAgcm9hZHNfYnlfZ3VfbmV3PC0gcmJpbmQobGluZXN0cmluZywgY29udmVydGVkKQp9CmBgYAoKYGBge3J9CnJvYWRzX2J5X2d3YW5hayA8LSByb2Fkc19ieV9ndV9uZXcgJT4lCiAgZmlsdGVyKG5hbWVfZW4gPT0gIkd3YW5hay1ndSIpCmhvc3BpdGFsX2J5X2d3YW5hayA8LSBob3NwaXRhbF9ieV9ndSAlPiUKICBmaWx0ZXIobmFtZV9lbiA9PSAiR3dhbmFrLWd1IikKcmVzaWRlbmNlX2J5X2d3YW5hayA8LSByZXNpZGVuY2VfYnlfZ3UgJT4lCiAgZmlsdGVyKG5hbWVfZW4gPT0gIkd3YW5hay1ndSIpCmBgYAoKYGBge3J9CnRtYXBfbW9kZSgidmlldyIpCnRtX3NoYXBlKHJvYWRzX2J5X2d3YW5haykgKwogIHRtX2xpbmVzKCkgKwogIHRtX3NoYXBlKGhvc3BpdGFsX2J5X2d3YW5haykgKwogIHRtX2RvdHMoY29sID0gImdyZWVuIikgKwogIHRtX3NoYXBlKHJlc2lkZW5jZV9ieV9nd2FuYWspICsKICB0bV9kb3RzKGNvbCA9ICJyZWQiKQoKYGBgCgojIyBQcmVwYXJpbmcgbGl4ZWxzIG9iamVjdAoKYGBge3J9CiMgRmlsdGVyIG91dCBvbmx5IExJTkVTVFJJTkcgZ2VvbWV0cmllcwpsaXhlbHMgPC0gbGl4ZWxpemVfbGluZXMocm9hZHNfYnlfZ3dhbmFrLCA3MDAsIG1pbmRpc3QgPSAzNTApCgpgYGAKCiMjIEdlbmVyYXRpbmcgbGluZSBjZW50cmUgcG9pbnRzCgpgYGB7cn0Kc2FtcGxlcyA8LSBsaW5lc19jZW50ZXIobGl4ZWxzKQpgYGAKCiMjIFBlcmZvcm1pbmcgTmV0S0RFCgpgYGB7cn0KaG9zcGl0YWxfYnlfZ3dhbmFrX3NwIDwtIGFzX1NwYXRpYWwoaG9zcGl0YWxfYnlfZ3dhbmFrKQpgYGAKCmBgYHtyfQpkZW5zaXRpZXMgPC0gbmtkZShyb2Fkc19ieV9nd2FuYWssIAogICAgICAgICAgICAgICAgICBldmVudHMgPSBob3NwaXRhbF9ieV9nd2FuYWssCiAgICAgICAgICAgICAgICAgIHcgPSByZXAoMSxucm93KGhvc3BpdGFsX2J5X2d3YW5haykpLAogICAgICAgICAgICAgICAgICBzYW1wbGVzID0gc2FtcGxlcywKICAgICAgICAgICAgICAgICAga2VybmVsX25hbWUgPSAicXVhcnRpYyIsCiAgICAgICAgICAgICAgICAgIGJ3ID0gMzAwLCAKICAgICAgICAgICAgICAgICAgZGl2PSAiYnciLCAKICAgICAgICAgICAgICAgICAgYWRhcHRpdmUgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgbWV0aG9kID0gImNvbnRpbnVvdXMiLCAKICAgICAgICAgICAgICAgICAgZGlnaXRzID0gMSwgCiAgICAgICAgICAgICAgICAgIHRvbCA9IDEsCiAgICAgICAgICAgICAgICAgIGdyaWRfc2hhcGUgPSBjKDEsMSksIAogICAgICAgICAgICAgICAgICBtYXhfZGVwdGggPSA4LAogICAgICAgICAgICAgICAgICBhZ2cgPSAyMCwgI3dlIGFnZ3JlZ2F0ZSBldmVudHMgd2l0aGluIGEgNW0gcmFkaXVzIChmYXN0ZXIgY2FsY3VsYXRpb24pCiAgICAgICAgICAgICAgICAgIHNwYXJzZSA9IFRSVUUsCiAgICAgICAgICAgICAgICAgIHZlcmJvc2UgPSBGQUxTRSkKYGBgCgojIyBWaXN1YWxpc2luZyBORVRLREUKCmBgYHtyfQpzYW1wbGVzJGRlbnNpdHkgPC0gZGVuc2l0aWVzKjEwMDAKbGl4ZWxzJGRlbnNpdHkgPC0gZGVuc2l0aWVzKjEwMDAKYGBgCgpgYGB7cn0KdG1hcF9tb2RlKCd2aWV3JykKdG1fc2hhcGUobGl4ZWxzKSsKICB0bV9saW5lcyhjb2w9ImRlbnNpdHkiKQpgYGAKCiMjIE5ldHdvcmsgY29uc3RyYWluZWQgRyBhbmQgSyBmdW5jdGlvbgoKKipIbzogVGhlIG9ic2VydmVkIHNwYXRpYWwgcG9pbnQgZXZlbnRzIChpLmUgZGlzdHJpYnV0aW9uIG9mIGNoaWxkY2FyZSBjZW50cmVzKSBhcmUgdW5pZm9ybWx5IGRpc3RyaWJ1dGVkIG92ZXIgYSBzdHJlZXQgbmV0d29yayBpbiBQdW5nZ29sIFBsYW5uaW5nIEFyZWEuKioKCmBgYHtyfQprZnVuX2hvc3BpdGFsIDwtIGtmdW5jdGlvbnMocm9hZHNfYnlfZ3dhbmFrLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3NwaXRhbF9ieV9nd2FuYWssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSAwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQgPSAzMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcCA9IDEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gNTAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zaW0gPSA1MCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbiA9IDUwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcmJvc2UgPSBGQUxTRSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnQgPSAwLjA1KQpgYGAKCmBgYHtyfQprZnVuX2hvc3BpdGFsJHBsb3RrCmBgYAoKIyMjIEdlb2dyYXBoaWNhbCBhY2Nlc3NpYmlsaXR5CgojIyMgVXNpbmcgRXVjbGlkZWFuIERpc3RhbmNlCgpgYGB7cn0KbGlicmFyeShzZikKbGlicmFyeShyZ2VvcykKCmRpc3RhbmNlX21hdHJpeCA8LSBhcy5tYXRyaXgoc3RfZGlzdGFuY2UocmVzaWRlbmNlX2J5X2d3YW5haywgaG9zcGl0YWxfYnlfZ3dhbmFrKSkKCmRpc3RfbWF0cml4PC0gbWF0cml4KGRpc3RhbmNlX21hdHJpeCkKCmBgYAo=